package org.example.java8.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;

/**
 * @author 夏焰波
 * @date 2020-07-13 0:16
 */
public class StreamMap2 {

    public static void main(String[] args) {
        //test();
        test2();
    }

    private static void test(){
        //flatMap，flat扁平化
        String[] words={"Hello","World"};
        //{H,e,l,l,o},{W,o,r,l,d} 返回一个包含两个String[]的stream
        Stream<String[]> stream = Arrays.stream(words).map(w -> w.split(""));

        //H,e,l,l,o,W,o,r,l,d 扁平化为一个流
        Stream<String> stringStream = stream.flatMap(Arrays::stream);

        stringStream.distinct().forEach(System.out::println);
    }

    /**
     * 这个实现方式是有问题的，传递给map方法的lambda为每个单词生成了一个String[](String列表)。
     * 因此，map返回的流实际上是Stream<String[]> 类型的。
     * 而真正想要的是用Stream<String>来表示一个字符串。
     */
    private static void test2(){
        String[] words = new String[]{"Hello","World"};
        //结果返回一个包含两个String[]的list
        List<String[]> a = Arrays.stream(words)
                .map(word -> word.split(""))
                .distinct()
                .collect(toList());
        a.forEach(System.out::print);
    }

    /**
     * 使用flatMap方法的效果是，各个数组并不是分别映射一个流，而是映射成流的内容，
     * 所有使用flatMap(Array::stream)时生成的单个流被合并起来，即扁平化为一个流。
     */
    private static void test3(){
        String[] words = new String[]{"Hello","World"};
        List<String> a = Arrays.stream(words)
                .map(word -> word.split(""))
                .flatMap(Arrays::stream)
                .distinct()
                .collect(toList());
        a.forEach(System.out::print);
        //结果输出：HeloWrd

    }
}
